<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>

// 普通函数需要定位到该函数并调用才会执行
function fn(){
    console.log( '普通函数' );
}
// fn();// 调用

// 匿名函数不允许单独定义：无法在变量对象中存储它，无法定位调用它
// function (){
//     console.log( '匿名函数' );
// }

// 匿名自执行函数（也叫 立即执行函数 IIFE）
// (function (){}) 第一个小括号是分组
// () 第二个小括号是调用函数
// (function (){
//     console.log( '程序1' );
// })();

// console.log( '程序2' );

// 使用自执行函数的主要目的：
// 1.自执行函数提供了一个局部作用域
// 2.自执行函数内部的变量不会和全局变量冲突

/* // 员工a：海静
var user = '海静';// 全局变量
function test1(){
    console.log( user );
}

// 员工b：康威
var user = '康威';// 全局变量
function test2(){
    console.log( user );
}

// 在某些场景需要分别执行两个人的代码
test1();
test2(); */


(function (){
    var user = '海静';// 局部变量
    function test1(){
        console.log( user );
    }
    test1();
})();

(function (){
    var user = '康威';// 局部变量
    function test2(){
        console.log( user );
    }
    test2();
})();


// 常见的自执行函数写法：() ! + - 这些运算符会导致后面的函数跳过预解析阶段，到执行阶段才会运行
(function (){
    console.log( '自执行函数 1' );
})();
(function (){
    console.log( '自执行函数 2' );
}());
var res = !function (){
    console.log( '自执行函数 3' );
}();
console.log( res );// true
+function (){
    console.log( '自执行函数 4' );
}();
-function (){
    console.log( '自执行函数 5' );
}();

// 语法解析错误
// function (){
//     console.log( '自执行函数 3' );
// }();

// 自执行函数传参？
(function (a,b){
    console.log( a+b );
})(2,3);

</script>
</body>
</html>